package uy.org.softtech.cssuite.web.controladores;

import static org.springframework.util.Assert.notNull;

import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Configuration;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import uy.org.softtech.cssuite.core.Controlador;
import uy.org.softtech.cssuite.servicios.ServiciosClientes;
import uy.org.softtech.cssuite.servicios.ServiciosTareas;
import uy.org.softtech.cssuite.servicios.ServiciosUsuarios;

/**
 * Controlador encargado de responder a los pedidos via AJAX a la aplicación.
 * 
 * @author fabian.lobo
 */
@Configuration
@Controller("controlador-ajax")
@ManagedResource(
	objectName = "cssuite:type=Controlador,name=ControladorAjax", 
	description = "Controlador encargado de responder a los pedidos via AJAX a la aplicación.",
	log = true, logFile = "jmx.log", currencyTimeLimit = 15,
	persistPolicy = "OnUpdate", persistPeriod = 200
)
@RequestMapping(produces = {"application/json; charset=UTF-8"})
public class ControladorAjax extends Controlador {

	private Logger log = Logger.getLogger(getClass());
	
	// Servicios
	@Resource(name = "servicios-usuarios" )
	private ServiciosUsuarios serviciosUsuarios;
	
	@Resource(name = "servicios-tareas")
	private ServiciosTareas serviciosTareas;
	
	@Resource(name = "servicios-clientes")
	private ServiciosClientes serviciosClientes;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		super.inicializacion();
		
		notNull(serviciosUsuarios(), "La propiedad [serviciosUsuarios] de [" + getClass().getName() + "] no ha sido establecida.");
		notNull(serviciosTareas(), "La propiedad [serviciosTareas] de [" + getClass().getName() + "] no ha sido establecida.");
		notNull(serviciosClientes(), "La propiedad [serviciosClientes] de [" + getClass().getName() + "] no ha sido establecida.");
		
		log.info("Controlador encargado de responder a los pedidos via AJAX a la aplicación ha sido inicializado.");
	}
	
	/* 
	 * ---------------------------------------
	 * ----------      PING      -------------
	 * ---------------------------------------
	 */
	/**
	 * Mantiene la sesión activa.
	 * 
	 * @author fabian.lobo
	 */
	@RequestMapping(method = RequestMethod.GET, value = "ping.json")
	@ResponseBody
	@Secured(value = {"ROLE_AUTENTICADO"})
	public Boolean ping() {
		return Boolean.TRUE;
	}
	
	/* 
	 * ---------------------------------------
	 * ---------  INDICADORES    -------------
	 * ---------------------------------------
	 */
	/**
	 * Indica la cantidad de sesiones activas.
	 * 
	 * @author fabian.lobo
	 */
	@RequestMapping(method = RequestMethod.GET, value = "indicador.json", params = {"modulo=SESIONES"})
	@ResponseBody
	@Secured(value = {"ROLE_VER_SESIONES"})
	public String sesionesAbiertas(Locale locale) {
		return Integer.toString(serviciosUsuarios().listarSesiones(locale).size());
	}
	
	/**
	 * Indica la cantidad de usuarios que tienen sesiones activas.
	 * 
	 * @author fabian.lobo
	 */
	@RequestMapping(method = RequestMethod.GET, value = "indicador.json", params = {"modulo=USUARIOS"})
	@ResponseBody
	@Secured(value = {"ROLE_VER_USUARIOS"})
	public String usuariosConectados() {
		return Integer.toString(serviciosUsuarios().usuariosConectados());
	}
	
	/**
	 * Indica la cantidad de tareas programadas que están actualmente en ejecución.
	 * 
	 * @author fabian.lobo
	 */
	@RequestMapping(method = RequestMethod.GET, value = "indicador.json", params = {"modulo=TAREAS"})
	@ResponseBody
	@Secured(value = {"ROLE_VER_TAREAS"})
	public String tareasEnEjecucion() {
		return Integer.toString(serviciosTareas().tareasEnEjecucion());
	}
	
	/**
	 * Indica la cantidad de clientes registrados.
	 * 
	 * @author fabian.lobo
	 */
	@RequestMapping(method = RequestMethod.GET, value = "indicador.json", params = {"modulo=CLIENTES"})
	@ResponseBody
	@Secured(value = {"ROLE_VER_CLIENTES"})
	public String clientesRegistrados() {
		return Integer.toString(serviciosClientes().listarClientes().size());
	}
	
	/*
	 *  GETTERS
	 */
	public ServiciosUsuarios serviciosUsuarios() {
		return serviciosUsuarios;
	}
	public ServiciosTareas serviciosTareas() {
		return serviciosTareas;
	}
	public ServiciosClientes serviciosClientes() {
		return serviciosClientes;
	}
	
}
